package com.wjw.java.others.exception_;

/**
 * try catch快捷键：选中代码ctrl+alt+t
 * -------------------------------------------------------------------------------------------
 * 异常可分为两大类：
 * 一、Error(错误)：Java虚拟机无法解决的严重问题,如:StackOverflowError(栈溢出),OOM(out of memory)
 * 二、Exception：因编程错误或偶然的外在因素导致的一般性问题,可以使用异常处理机制,增强代码的健壮性
 *    Exception分为编译异常和运行异常
 *    编译异常,必须使用try-catch-finally或throws
 *    运行异常,编译器检查不出来,程序中如果没有处理,默认就是throws的方式处理
 * -------------------------------------------------------------------------------------------
 * 异常处理的方式：
 * 1、try-catch-finally,catch块可以有多个,捕获多种异常进行处理,此时子类异常应写在父类异常的前面
 *
 *    try{
 *        //可能发生异常的代码,如果发生异常将执行catch中的代码,try中剩下的代码不再执行
 *    }catch(Exception e){
 *        //发生异常后,捕获异常,将异常信息封装到Exception对象中
 *    }finally{
 *       //无论如何都会执行的代码,通常用于释放资源
 *    }
 *
 * 2、throws代表一种状态,代表方法可能有异常抛出,交给调用者处理,最顶级的处理者就是JVM
 *
 *    JVM执行                 -->   main()调用           -->  f1()调用                -->f2()
 *                                                                                       ↓
 *    JVM输出异常信息,退出程序  <--  main()throws或t-c-f  <--  f1()throws或t-c-f  <--  throws或t-c-f
 *
 * 3、throw代表动作,表示抛出一个异常的动作,
 * -------------------------------------------------------------------------------------------
 * throws和throw的区别：
 * throws代表一种状态,代表方法可能有异常抛出,用在方法声明的地方,后面跟异常类型
 * throw代表动作,表示抛出一个异常的动作,用在方法体中,后面跟异常对象
 * -------------------------------------------------------------------------------------------
 */
public class RuntimeException_ {
    public static void main(String[] args) {
        //常见的运行异常RuntimeException
        //NullPointerException_();
        //ArithmeticException_();
        //ArrayIndexOutOfBoundsException_();
        //NumberFormatException_();
        //ClassCastException_();
    }

    //-----------------------------常见的运行异常RuntimeException(start)-----------------------------
    public static void NullPointerException_(){//空指针异常
        String name = "wjw";
        System.out.println(name.length());
        name = null;
        System.out.println(name.length());
    }

    public static void ArithmeticException_(){//算术异常
        int i = 10 / 0;
        System.out.println(i);
    }

    public static void ArrayIndexOutOfBoundsException_(){//数组下标越界异常
        int [] arr = {1,2,3,4,5};
        System.out.println(arr[5]);//下标从0开始,下标为5的元素不存在
    }

    public static void NumberFormatException_(){//数字转换异常
        String name = "wjw";
        int num = Integer.parseInt(name);
    }

    public static void ClassCastException_(){//类型转换异常
        Father father = new Son(); //多态：父类的引用指向子类对象,向上转型,正确
        Son son = (Son)father;//向下转型,转为子类,正确
        /**
         * 这里运行后,会抛出类型转换错误,
         * 因为父类的引用指向的是Son子类,
         * 这里将Daughter强转为一个指向Son的子类,Son和Daughter直接没有继承关系
         * 相当于把Son儿子转换成Daughter女儿
         * 正确做法是：
         * Father father1 = new Daughter();
         * Daughter daughter = (Daughter)father1;
         */
        Daughter daughter = (Daughter)father;//
    }
    //-----------------------------常见的运行异常RuntimeException(end)-----------------------------


}
class Father{}
class Son extends Father{}
class Daughter extends Father{}
